<html>
<head>
<title>CouchDB - Cloudant</title>
</head>

<body bgcolor="#ffffff">

<h1>CouchDB - Cloudant</h1>

(GDAL/OGR >= 2.0.0)<p>

Cloudant and CouchDB are API compatible and based on the same core technology. The geospatial extension for Cloudant
is separate to GeoCouch.

This driver can connect to the a Cloudant service, potentially enabled with the Cloudant spatial extension.<p>
GDAL/OGR must be built with Curl support in order to the Cloudant driver to be compiled.<p>
The driver supports read and write operations.<p>

<h2>Cloudant vs OGR concepts</h2>

A Cloudant database is considered as a OGR layer. A Cloudant document is considered as a OGR feature.<p>

OGR preferably handles Cloudant documents following the GeoJSON specification.<p>

<h2>Dataset name syntax</h2>

The syntax to open a Cloudant datasource is : <pre>cloudant:http://example.com[/layername]</pre> where
http://example.com points to the root of a CouchDB repository and, optionally, layername is the name of a CouchDB database.<p>

It is also possible to directly open a view : <pre>cloudant:http://example.com/layername/_design/adesigndoc/_view/aview[?include_docs=true]</pre>
The include_docs=true might be needed depending on the value returned by the emit() call in the map() function.<p>

<h2>Authentication</h2>

Some operations, in particular write operations, require authentication. The authentication can
be passed with the <i>CLOUDANT_USERPWD</i> environment variable set to user:password or directly in the URL.<p>

<h2>Filtering</h2>

The driver will forward any spatial filter set with SetSpatialFilter() to the server when the Cloudant extension
is available.<p>

By default, the driver will try the following spatial filter function "_design/SpatialView/_geo/spatial",
which is the valid spatial filter function for layers created by OGR. If that filter function does not exist,
but another one exists, you can specify it with the CLOUDANT_SPATIAL_FILTER configuration option.<p>
<p>

<h2>Paging</h2>

Features are retrieved from the server by chunks of 200 by default. Cloudant uses bookmarks to page through the data.

<h2>Write support</h2>

Table creation and deletion is possible.<p>

Write support is only enabled when the datasource is opened in update mode.<p>

When inserting a new feature with CreateFeature(), and if the command is successful, OGR will fetch the
returned _id and _rev and use them.<p>

<h2>Write support and OGR transactions</h2>

The CreateFeature()/SetFeature() operations are by default issued to the server synchronously with the OGR API call. This however
can cause performance penalties when issuing a lot of commands due to many client/server exchanges.<p>

It is possible to surround the CreateFeature()/SetFeature() operations between OGRLayer::StartTransaction() and OGRLayer::CommitTransaction().
The operations will be stored into memory and only executed at the time CommitTransaction() is called.<p>

<h2>Layer creation options</h2>

The following layer creation options are supported:
<ul>
<li><b>UPDATE_PERMISSIONS</b> = LOGGED_USER|ALL|ADMIN|function(...)|DEFAULT : Update permissions for the new layer.
<ul>
<li>If set to LOGGED_USER (the default), only logged users will be able to make changes in the layer.</li>
<li>If set to ALL, all users will be able to make changes in the layer.</li>
<li>If set to ADMIN, only administrators will be able to make changes in the layer.</li>
<li>If beginning with "function(", the value of the creation option will be used as the content of the <a href="http://guide.couchdb.org/draft/validation.html">validate_doc_update function</a>.</li>
<li>Otherwise, all users will be allowed to make changes in non-design documents.</li>
</ul>
</li>
<li><b>GEOJSON</b> = YES|NO : Set to NO to avoid writing documents as GeoJSON documents. Default to YES.</li>
<li><b>COORDINATE_PRECISION</b> = int_number : Maximum number of figures after decimal separator to write in coordinates.
Default to 15. "Smart" truncation will occur to remove trailing zeros.
Note: when opening a dataset in update mode, the OGR_CLOUDANT_COORDINATE_PRECISION configuration option can be set to have a similar role.</li>
</ul>

<h2>Examples</h2>

<li>
Listing the tables of a Cloudant repository:
<pre>
ogrinfo -ro "cloudant:http://some_account.some_cloudant_server.com"
</pre>
<p>

<li>
Creating and populating a table from a shapefile:
<pre>
ogr2ogr -f cloudant "cloudant:http://some_account.some_cloudant_server.com" shapefile.shp
</pre>
<p>

<h2>See Also</h2>

<ul>
<li> <a href="http://wiki.apache.org/couchdb/Reference">CouchDB reference</a><p>
<li> <a href="https://cloudant.com/product/cloudant-features/geospatial/">Cloudant Geospatial</a><p>
<li> <a href="http://guide.couchdb.org/draft/validation.html">Documentation for 'validate_doc_update' function</a><p>
</ul>

</body>
</html>
